<?php
namespace app\job;
use hawk\ElasticSearch;
use think\queue\Job;
use think\facade\Db;
use think\facade\Log;

class Test{
    private $esClient = null;
    public function __construct()
    {
        $this->esClient = new ElasticSearch();   // 创建Client
    }

    /**
     * 创建任务类
     * 任务类不需继承任何类，如果这个类只有一个任务，那么就只需要提供一个fire方法就可以了，如果有多个小任务，就写多个方法，下面发布任务的时候会有区别
     * 还有个可选的任务失败执行的方法 failed 传入的参数为$data（发布任务时自定义的数据）
     * @param Job $job  当前的任务对象
     * @param $data array 发布任务时自定义的数据
     */
    public function fire(Job $job, $data){

        // ....这里执行具体的任务
        $isJobDone = $this->doTask($data,$job);
        if ($isJobDone) {
            // 成功删除任务
            $job->delete();
        }else{
            // 此任务超过3次则三次
            $attempts = $job->attempts();
            if ($attempts > 3) {
                //通过这个方法可以检查这个任务已经重试了几次了
                // todo .... 删除前逻辑
                $this->failed('app\job\Test','testTask',$data);
                $job->delete();
            }else{
                // 不成功延迟2发再次发布
                $job->release(2);
            }
        }
    }

    /**
     * 执行逻辑
     * @param $data array 数据
     * @param $job
     * @return bool 返回结果
     */
    public function doTask($data,$job){
        $attempts = $job->attempts();
        $params = [
            'name'=>$data['name'],
            'type'=>1,
            'attempts'=>$attempts
        ];
        // 执行数据写入到数据库或逻辑处理
        $re = false;
        try {
            $re = Db::table('hawk_test_queue')->insert($params);
//            $params['id'] = Db::table('hawk_test_queue')->getLastInsID();
//            $params['create_time'] = date('Y-m-d H:i:s',time());
//            $params['status'] = 0;
//            $params['update_time'] = '';
//            $this->esClient->addDos($params['id'],$params,'test_queue');
        }catch (\Exception $e){
            Log::write("传入数据:".json_encode($data));
            Log::write("执行结果:".$e->getMessage().'-'.$e->getFile().'-'.$e->getLine());
        }
        if ($re) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 发布失败
     * @param $job_handle_name
     * @param $job_queue_name
     * @param $data
     */
    public function failed($job_handle_name,$job_queue_name,$data){
        // todo ...任务达到最大重试次数后，失败了
        $params = [
            'job_handle_name'=>$job_handle_name,
            'job_queue_name'=>$job_queue_name,
            'params'=>json_encode($data)
        ];
        var_dump("消费失败执行数据:".json_encode($params));
        $re = false;
        try {
            $re = Db::table('hawk_task_error')->insert($params);
        }catch (\Exception $e){
            Log::write("消费失败执行结果:".$e->getMessage().'-'.$e->getFile().'-'.$e->getLine());
        }
        if ($re) {
            return true;
        } else {
            return false;
        }
    }

}